import bpy
from bpy.types import Operator
from 全局控制.Node.节点和插座基类.bl_UpdateNode import *
import 全局控制.Node.节点和插座基类.bl_节点基类 as 基类

import engine.initLIB.load_dll as engineLib
import ctypes


engineLib.flexCAPI.f_创建调试信息输出节点.restype = ctypes.c_bool





类型枚举 = [
	("TYPE_手动", "手动", "", 0),
	("标识_逐帧", "逐帧", "", 1),
]


class C_SceneNode_信息输出(基类.C_SN_基类):
	bl_dname = 'bl_node_信息输出'
	bl_label = '信息输出'

	#m_Value = bpy.props.StringProperty()
	def init(self, context):
		super(C_SceneNode_信息输出, self).f_init(context)
		self.inputs.new('C_NodeSocket_文本', name='输入数据')
		
	def draw_buttons(self, context, layout):
		pass
	
	def update(self):
		pass
		#self.f_update()
		#super(C_SceneNode_信息输出, self).update()
	def f_input插座Update(self, input插座, 上层Output=None):
		#print('input插座 = ', input插座)
		if input插座 :
			if input插座.name == '输入数据':
				插座 = None
				if 上层Output :
					插座 = 上层Output
				else:
					插座 = f_get上一层Output插座(input插座)
				#print("f_get上一层Output插座 = ", 插座, 插座.node.name)
				if 插座 != None :
					data = 插座.f_getData()
					input插座.m_Value = type(data).__name__ + ':' + str(data) #[1]['default']
		
	def f_update(self, 是否向下传递=False, input插座=None):
		#data = self.inputs['输入数据'].f_getData()
		#self.inputs['输入数据'].f_setData(data)
		#print("Info Ouput : ", data)
		#print(type(data).__name__ + ':' + str(data) )
		super(C_SceneNode_信息输出, self).f_update(是否向下传递, input插座)
		


class C_NODE_MENU_信息输出(bpy.types.Operator):
	bl_idname = 'node.global_node_debug_info'
	bl_label = 'Add 信息输出'
	bl_options = {'REGISTER', 'UNDO'}

	def execute(operator, context):
		operator.use_transform = True
		bpy.ops.node.add_node(type='C_SceneNode_信息输出', use_transform=True)
		return {'FINISHED'}











class C_Node_调试信息输出(基类.C_Node_基类):
	bl_label = '信息输出'
	m_调试信息 = bpy.props.PointerProperty(type=bpy.types.Text)
	m_文件保存 = bpy.props.BoolProperty(default=False)
	def init(self, context):
		super(C_Node_调试信息输出, self).f_init(context)
		self.inputs.new('C_Socket_Any转PyObject', name='输入数据')
		
		self.f_toCPP(self.id_data)

	def f_toCPP(self, tree):
		新创建 = engineLib.flexCAPI.f_创建调试信息输出节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 新创建 :
			pass
		if self.m_调试信息 == None :
			name = '__debug_view_'+self.name+'__'
			self.m_调试信息 = bpy.data.texts.new(name)
			'''print("'__debug_view_'+self.name+'__' = ", '__debug_view_'+self.name+'__', self.m_调试信息)
			if self.m_调试信息 == None :
				name = '__debug_view_'+self.name+'__'
				id = bpy.data.texts.find(name)
				if id >= 0 :
					self.m_调试信息 = bpy.data.texts[id]
				else:
					self.m_调试信息 = bpy.data.texts.new(name)'''

	def draw_buttons(self, context, layout):
		if self.m_文件保存 :
			layout.prop(self, 'm_调试信息')
		else:
			#print('self.m_调试信息 = ', self.m_调试信息)
			if self.m_调试信息 :
				for line in self.m_调试信息.lines :
					layout.label(text=line.body)
				
	def f_update(self):
		if self.m_调试信息 == None :
			name = '__debug_view_'+self.name+'__'
			self.m_调试信息 = bpy.data.texts.new(name)

		if self.m_调试信息:
			#return
			data = self.inputs['输入数据'].f_getData()
			
			self.m_调试信息.clear()
			#print('debug == ', data)
			num = len(data)

			if self.m_文件保存 :
				if num > (1024 + 64) :
					for i in range(1024):
						self.m_调试信息.write(str(data[i]))
						self.m_调试信息.write('\n')
					
					for i in range(6):
						self.m_调试信息.write('. \n')
						
					for i in range(64):
						self.m_调试信息.write(str(data[num-64 + i]))
						self.m_调试信息.write('\n')
				else:
					for line in data:
						self.m_调试信息.write(str(line))
						self.m_调试信息.write('\n')
					#self.m_调试信息.lines[0].body = str(data)
				#print(data)
			elif num > 32 :
				if num > 32 :
					for i in range(24):
						self.m_调试信息.write(str(data[i]))
						self.m_调试信息.write('\n')
					
					for i in range(2):
						self.m_调试信息.write('. \n')
						
					for i in range(6):
						self.m_调试信息.write(str(data[num-6 + i]))
						self.m_调试信息.write('\n')
					
			else:
				for line in data:
					self.m_调试信息.write(str(line))
					self.m_调试信息.write('\n')
		


class C_NODE_MENU_调试信息输出(bpy.types.Operator):
	bl_idname = 'node.global_node_view_debug'
	bl_label = '调试信息输出'
	bl_options = {'REGISTER', 'UNDO'}
	
	def execute(operator, context):
		operator.use_transform = True
		bpy.ops.node.add_node(type='C_Node_调试信息输出', use_transform=True)
		return {'FINISHED'}





classes = (
	C_Node_调试信息输出,
	C_NODE_MENU_调试信息输出,
)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		

def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)

